#region API
	function __addon_lua_setup_functions(lua) {
		for( var i = 0, n = array_length(global.__lua_functions); i < n; i++ ) {
			var _func = global.__lua_functions[i];
			
			if(is_string(_func))
				lua_add_code(lua, _func);
			else if(is_array(_func))
				lua_add_function(lua, _func[0], _func[1]);
		}
	}
	
	global.__lua_functions = [
		[ "print", print ], 
		
		[ "colour_get_blue",       colour_get_blue       ],
		[ "colour_get_green",      colour_get_green      ],
		[ "colour_get_red",        colour_get_red        ],
		[ "colour_get_hue",        colour_get_hue        ],
		[ "colour_get_saturation", colour_get_saturation ],
		[ "colour_get_value",      colour_get_value      ],
		[ "draw_getpixel",         draw_getpixel         ],
		[ "draw_getpixel_ext",     draw_getpixel_ext     ],
		[ "draw_get_colour",       draw_get_colour       ],
		[ "draw_get_alpha",        draw_get_alpha        ],

		[ "make_colour_hsv",       make_colour_hsv       ],
		[ "make_colour_rgb",       make_colour_rgb       ],
		[ "merge_colour",          merge_colour          ],

		[ "draw_clear",            draw_clear            ],
		[ "draw_clear_alpha",      draw_clear_alpha      ],
		[ "draw_set_alpha",        draw_set_alpha        ],
		[ "draw_set_colour",       draw_set_colour       ],

		// gpu
		[ "gpu_get_blendenable",            gpu_get_blendenable            ],
		[ "gpu_get_ztestenable",            gpu_get_ztestenable            ],
		[ "gpu_get_zfunc",                  gpu_get_zfunc                  ],
		[ "gpu_get_zwriteenable",           gpu_get_zwriteenable           ],
		[ "gpu_get_fog",                    gpu_get_fog                    ],
		[ "gpu_get_cullmode",               gpu_get_cullmode               ],
		[ "gpu_get_blendmode",              gpu_get_blendmode              ],
		[ "gpu_get_blendmode_ext",          gpu_get_blendmode_ext          ],
		[ "gpu_get_blendmode_ext_sepalpha", gpu_get_blendmode_ext_sepalpha ],
		[ "gpu_get_blendmode_src",          gpu_get_blendmode_src          ],
		[ "gpu_get_blendmode_dest",         gpu_get_blendmode_dest         ],
		[ "gpu_get_blendmode_srcalpha",     gpu_get_blendmode_srcalpha     ],
		[ "gpu_get_blendmode_destalpha",    gpu_get_blendmode_destalpha    ],
		[ "gpu_get_colourwriteenable",      gpu_get_colourwriteenable      ],
		[ "gpu_get_alphatestenable",        gpu_get_alphatestenable        ],
		[ "gpu_get_alphatestref",           gpu_get_alphatestref           ],
		[ "gpu_get_texfilter",              gpu_get_texfilter              ],
		[ "gpu_get_texfilter_ext",          gpu_get_texfilter_ext          ],
		[ "gpu_get_texrepeat",              gpu_get_texrepeat              ],
		[ "gpu_get_texrepeat_ext",          gpu_get_texrepeat_ext          ],

		[ "gpu_set_blendenable",            gpu_set_blendenable            ],
		[ "gpu_set_ztestenable",            gpu_set_ztestenable            ],
		[ "gpu_set_zfunc",                  gpu_set_zfunc                  ],
		[ "gpu_set_zwriteenable",           gpu_set_zwriteenable           ],
		[ "gpu_set_fog",                    gpu_set_fog                    ],
		[ "gpu_set_cullmode",               gpu_set_cullmode               ],
		[ "gpu_set_blendmode",              gpu_set_blendmode              ],
		[ "gpu_set_blendmode_ext",          gpu_set_blendmode_ext          ],
		[ "gpu_set_blendmode_ext_sepalpha", gpu_set_blendmode_ext_sepalpha ],
		[ "gpu_set_colourwriteenable",      gpu_set_colourwriteenable      ],
		[ "gpu_set_alphatestenable",        gpu_set_alphatestenable        ],
		[ "gpu_set_alphatestref",           gpu_set_alphatestref           ],
		[ "gpu_set_texfilter",              gpu_set_texfilter              ],
		[ "gpu_set_texfilter_ext",          gpu_set_texfilter_ext          ],
		[ "gpu_set_texrepeat",              gpu_set_texrepeat              ],
		[ "gpu_set_texrepeat_ext",          gpu_set_texrepeat_ext          ],

		[ "gpu_push_state",                 gpu_push_state                 ],
		[ "gpu_pop_state",                  gpu_pop_state                  ],
		[ "gpu_get_state",                  gpu_get_state                  ],
		[ "gpu_set_state",                  gpu_set_state                  ],

		// basic form
		[ "draw_set_color",            draw_set_color            ],
		[ "draw_set_alpha",            draw_set_alpha            ],
		[ "gpu_set_blendmode",         gpu_set_blendmode         ],
		[ "gpu_set_blendmode_ext",     gpu_set_blendmode_ext     ],
		
		[ "draw_arrow",                draw_arrow                ],
		[ "draw_circle",               draw_circle               ],
		[ "draw_circle_colour",        draw_circle_colour        ],
		[ "draw_ellipse",              draw_ellipse              ],
		[ "draw_ellipse_colour",       draw_ellipse_colour       ],
		[ "draw_line",                 draw_line                 ],
		[ "draw_line_colour",          draw_line_colour          ],
		[ "draw_line_width",           draw_line_width           ],
		[ "draw_line_width_colour",    draw_line_width_colour    ],
		[ "draw_line_round",           draw_line_round           ],
		[ "draw_line_round_color",     draw_line_round_color     ],
		[ "draw_point",                draw_point                ],
		[ "draw_point_colour",         draw_point_colour         ],
		[ "draw_rectangle",            draw_rectangle            ],
		[ "draw_rectangle_colour",     draw_rectangle_colour     ],
		[ "draw_roundrect",            draw_roundrect            ],
		[ "draw_roundrect_colour",     draw_roundrect_colour     ],
		[ "draw_roundrect_ext",        draw_roundrect_ext        ],
		[ "draw_roundrect_colour_ext", draw_roundrect_colour_ext ],
		[ "draw_triangle",             draw_triangle             ],
		[ "draw_triangle_colour",      draw_triangle_colour      ],

		[ "draw_set_circle_precision", draw_set_circle_precision ],
		[ "draw_button",               draw_button               ],
		[ "draw_healthbar",            draw_healthbar            ],
		[ "draw_path",                 draw_path                 ],

		//sprite
		[ "draw_self",                 draw_self                 ],
		[ "draw_sprite",               draw_sprite               ],
		[ "draw_sprite_ext",           draw_sprite_ext           ],
		[ "draw_sprite_general",       draw_sprite_general       ],
		[ "draw_sprite_part",          draw_sprite_part          ],
		[ "draw_sprite_part_ext",      draw_sprite_part_ext      ],
		[ "draw_sprite_stretched",     draw_sprite_stretched     ],
		[ "draw_sprite_stretched_ext", draw_sprite_stretched_ext ],
		[ "draw_sprite_pos",           draw_sprite_pos           ],
		[ "draw_sprite_tiled",         draw_sprite_tiled         ],
		[ "draw_sprite_tiled_ext",     draw_sprite_tiled_ext     ],

		// text
		[ "draw_set_font",                    draw_set_font                    ],
		[ "draw_set_halign",                  draw_set_halign                  ],
		[ "draw_set_valign",                  draw_set_valign                  ],
		[ "draw_get_font",                    draw_get_font                    ],
		[ "draw_get_halign",                  draw_get_halign                  ],
		[ "draw_get_valign",                  draw_get_valign                  ],
		[ "draw_set_text",                    draw_set_text                    ],

		[ "draw_text",                        draw_text_add                    ],
		[ "draw_text_line",                   draw_text_ext_add                ],
		[ "draw_text_colour",                 draw_text_colour                 ],
		[ "draw_text_transformed",            draw_text_transformed            ],
		[ "draw_text_ext_colour",             draw_text_ext_colour             ],
		[ "draw_text_ext_transformed",        __draw_text_ext_transformed      ],
		[ "draw_text_transformed_colour",     draw_text_transformed_colour     ],
		[ "draw_text_ext_transformed_colour", draw_text_ext_transformed_colour ],

		//primitive
		[ "draw_primitive_begin",                 draw_primitive_begin                 ],
		[ "draw_primitive_begin_texture",         draw_primitive_begin_texture         ],
		[ "draw_primitive_end",                   draw_primitive_end                   ],
		[ "draw_vertex",                          draw_vertex                          ],
		[ "draw_vertex_colour",                   draw_vertex_colour                   ],
		[ "draw_vertex_texture",                  draw_vertex_texture                  ],
		[ "draw_vertex_texture_colour",           draw_vertex_texture_colour           ],

		[ "vertex_format_begin",                  vertex_format_begin                  ],
		[ "vertex_format_add_colour",             vertex_format_add_colour             ],
		[ "vertex_format_add_position",           vertex_format_add_position           ],
		[ "vertex_format_add_position_3d",        vertex_format_add_position_3d        ],
		[ "vertex_format_add_texcoord",           vertex_format_add_texcoord           ],
		[ "vertex_format_add_normal",             vertex_format_add_normal             ],
		[ "vertex_format_add_custom",             vertex_format_add_custom             ],
		[ "vertex_format_end",                    vertex_format_end                    ],
		[ "vertex_format_delete",                 vertex_format_delete                 ],

		[ "vertex_create_buffer",                 vertex_create_buffer                 ],
		[ "vertex_create_buffer_ext",             vertex_create_buffer_ext             ],
		[ "vertex_create_buffer_from_buffer",     vertex_create_buffer_from_buffer     ],
		[ "vertex_create_buffer_from_buffer_ext", vertex_create_buffer_from_buffer_ext ],
		[ "vertex_get_buffer_size",               vertex_get_buffer_size               ],
		[ "vertex_get_number",                    vertex_get_number                    ],
		[ "vertex_delete_buffer",                 vertex_delete_buffer                 ],
		[ "vertex_begin",                         vertex_begin                         ],
		[ "vertex_colour",                        vertex_colour                        ],
		[ "vertex_normal",                        vertex_normal                        ],
		[ "vertex_position",                      vertex_position                      ],
		[ "vertex_position_3d",                   vertex_position_3d                   ],
		[ "vertex_argb",                          vertex_argb                          ],
		[ "vertex_texcoord",                      vertex_texcoord                      ],
		[ "vertex_float1",                        vertex_float1                        ],
		[ "vertex_float2",                        vertex_float2                        ],
		[ "vertex_float3",                        vertex_float3                        ],
		[ "vertex_float4",                        vertex_float4                        ],
		[ "vertex_ubyte4",                        vertex_ubyte4                        ],
		[ "vertex_end",                           vertex_end                           ],
		[ "vertex_freeze",                        vertex_freeze                        ],
		[ "vertex_submit",                        vertex_submit                        ],

		// surface
		[ "surface_exists",              surface_exists              ],
		[ "surface_create",              surface_create              ],
		[ "surface_create_ext",          surface_create_ext          ],
		[ "surface_resize",              surface_resize              ],
		[ "surface_set_target",          surface_set_target          ],
		[ "surface_set_target_ext",      surface_set_target_ext      ],
		[ "surface_get_target",          surface_get_target          ],
		[ "surface_get_target_ext",      surface_get_target_ext      ],
		[ "surface_reset_target",        surface_reset_target        ],
		[ "surface_copy",                surface_copy                ],
		[ "surface_copy_part",           surface_copy_part           ],
		[ "surface_depth_disable",       surface_depth_disable       ],
		[ "surface_get_height_safe",     surface_get_height_safe     ],
		[ "surface_get_width_safe",      surface_get_width_safe      ],
		[ "surface_get_texture",         surface_get_texture         ],
		[ "surface_get_depth_disable",   surface_get_depth_disable   ],
		[ "surface_getpixel",            surface_getpixel            ],
		[ "surface_getpixel_ext",        surface_getpixel_ext        ],
		[ "surface_get_format",          surface_get_format          ],
		[ "surface_format_is_supported", surface_format_is_supported ],
		[ "surface_free",                surface_free                ],
		[ "surface_save",                surface_save                ],
		[ "surface_save_part",           surface_save_part           ],
		[ "is_surface",                  is_surface                  ],

		[ "draw_surface",                draw_surface                ],
		[ "draw_surface_ext_safe",       draw_surface_ext_safe       ],
		[ "draw_surface_part",           draw_surface_part           ],
		[ "draw_surface_part_ext",       draw_surface_part_ext       ],
		[ "draw_surface_stretched",      draw_surface_stretched      ],
		[ "draw_surface_stretched_ext",  draw_surface_stretched_ext  ],
		[ "draw_surface_tiled",          draw_surface_tiled          ],
		[ "draw_surface_tiled_ext",      draw_surface_tiled_ext      ],
		[ "draw_surface_general",        draw_surface_general        ],

		[ "buffer_get_surface",          buffer_get_surface          ],
		[ "buffer_set_surface",          buffer_set_surface          ],
		
		//sprite
		[ "sprite_collision_mask",       sprite_collision_mask       ],
		[ "sprite_set_offset",           sprite_set_offset           ],
		[ "sprite_set_bbox_mode",        sprite_set_bbox_mode        ],
		[ "sprite_set_bbox",             sprite_set_bbox             ],
		[ "sprite_set_speed",            sprite_set_speed            ],
		[ "sprite_set_nineslice",        sprite_set_nineslice        ],

		[ "__sprite_add", function(_ID, _path, _amo, rem = false, smt = false, xoff = 0, yoff = 0) {
			var _addon = noone;
			with(_addon_custom) if(self.ID == _ID) _addon = self;
			if(_addon == noone) return undefined;
			
			_path = string_replace(_path, "./", _addon.directory + "/");
			return sprite_add(_path, _amo, rem, smt, xoff, yoff);
		}],
		@"function sprite_add(path, _amo, rem, smt, xoff, yoff)
			rem  = rem or false
			smt  = smt or false
			xoff = xoff or 0
			yoff = yoff or 0
			return __sprite_add(ID, path, _amo, rem, smt, xoff, yoff)
		end",
		[ "sprite_delete",                sprite_delete                ],
		[ "sprite_replace",               sprite_replace               ],
		[ "sprite_duplicate",             sprite_duplicate             ],
		[ "sprite_assign",                sprite_assign                ],
		[ "sprite_merge",                 sprite_merge                 ],
		[ "sprite_set_alpha_from_sprite", sprite_set_alpha_from_sprite ],
		[ "sprite_nineslice_create",      sprite_nineslice_create      ],
		[ "sprite_create_from_surface",   sprite_create_from_surface   ],
		[ "sprite_add_from_surface",      sprite_add_from_surface      ],
		
		//variable
		[ "variable_instance_exists",      variable_instance_exists      ],
		[ "variable_instance_get_names",   variable_instance_get_names   ],
		[ "variable_instance_names_count", variable_instance_names_count ],
		[ "variable_instance_get",         variable_instance_get         ],
		[ "variable_instance_set",         variable_instance_set         ],
		[ "variable_global_exists",        variable_global_exists        ],
		[ "variable_global_get",           variable_global_get           ],
		[ "variable_global_set",           variable_global_set           ],

		[ "method",                        method                        ],
		[ "method_get_self",               method_get_self               ],
		[ "method_get_index",              method_get_index              ],
		[ "method_call",                   method_call                   ],

		[ "variable_struct_exists",        variable_struct_exists        ],
		[ "variable_struct_get",           variable_struct_get           ],
		[ "variable_struct_set",           variable_struct_set           ],
		[ "variable_struct_remove",        variable_struct_remove        ],
		[ "variable_struct_get_names",     variable_struct_get_names     ],
		[ "variable_struct_names_count",   variable_struct_names_count   ],
		[ "is_instanceof",                 is_instanceof                 ],
		[ "static_get",                    static_get                    ],
		[ "static_set",                    static_set                    ],
		[ "instanceof",                    instanceof                    ],

		[ "is_string",    is_string    ],
		[ "is_real",      is_real      ],
		[ "is_numeric",   is_numeric   ],
		[ "is_bool",      is_bool      ],
		[ "is_array",     is_array     ],
		[ "is_struct",    is_struct    ],
		[ "is_method",    is_method    ],
		[ "is_callable",  is_callable  ],
		[ "is_ptr",       is_ptr       ],
		[ "is_int32",     is_int32     ],
		[ "is_int64",     is_int64     ],
		[ "is_undefined", is_undefined ],
		[ "is_nan",       is_nan       ],
		[ "is_infinity",  is_infinity  ],
		[ "typeof",       typeof       ],
		[ "bool",         bool         ],
		[ "ptr",          ptr          ],
		[ "int64",        int64        ],

		//array
		[ "array_create",       array_create       ],
		[ "array_copy",         array_copy         ],
		[ "array_equals",       array_equals       ],
		[ "array_get",          array_get          ],
		[ "array_set",          array_set          ],
		[ "array_push",         array_push         ],
		[ "array_pop",          array_pop          ],
		[ "array_insert",       array_insert       ],
		[ "array_delete",       array_delete       ],
		[ "array_get_index",    array_get_index    ],
		[ "array_contains",     array_contains     ],
		[ "array_contains_ext", array_contains_ext ],
		[ "array_sort",         array_sort         ],
		[ "array_reverse",      array_reverse      ],
		[ "array_shuffle",      array_shuffle      ],
		[ "array_length",       array_length       ],
		[ "array_resize",       array_resize       ],
		[ "array_first",        array_first        ],
		[ "array_last",         array_last         ],

		[ "array_find_index",   array_find_index   ],
		[ "array_any",          array_any          ],
		[ "array_all",          array_all          ],
		[ "array_foreach",      array_foreach      ],
		[ "array_reduce",       array_reduce       ],
		[ "array_concat",       array_concat       ],
		[ "array_union",        array_union        ],
		[ "array_intersection", array_intersection ],
		[ "array_filter",       array_filter       ],
		[ "array_map",          array_map          ],
		[ "array_unique",       array_unique       ],
		[ "array_copy_while",   array_copy_while   ],

		[ "array_create_ext",   array_create_ext   ],
		[ "array_filter_ext",   array_filter_ext   ],
		[ "array_map_ext",      array_map_ext      ],
		[ "array_unique_ext",   array_unique_ext   ],
		[ "array_reverse_ext",  array_reverse_ext  ],
		[ "array_shuffle_ext",  array_shuffle_ext  ],

		//window
		[ "window_center",            window_center            ],
		[ "window_handle",            window_handle            ],
		[ "window_get_caption",       window_get_caption       ],
		[ "window_get_colour",        window_get_colour        ],
		[ "window_get_fullscreen",    window_get_fullscreen    ],
		[ "window_get_width",         window_get_width         ],
		[ "window_get_height",        window_get_height        ],
		[ "window_get_x",             window_get_x             ],
		[ "window_get_y",             window_get_y             ],
		[ "window_get_cursor",        window_get_cursor        ],
		[ "window_get_visible_rects", window_get_visible_rects ],
		[ "window_mouse_get_x",       window_mouse_get_x       ],
		[ "window_mouse_get_y",       window_mouse_get_y       ],
		[ "window_mouse_set",         window_mouse_set         ],
		[ "window_set_caption",       window_set_caption       ],
		[ "window_set_colour",        window_set_colour        ],
		[ "winMan_setFullscreen",     winMan_setFullscreen     ],
		[ "window_set_position",      window_set_position      ],
		[ "window_set_size",          window_set_size          ],
		[ "window_set_cursor",        window_set_cursor        ],
		[ "window_set_min_width",     window_set_min_width     ],
		[ "window_set_max_width",     window_set_max_width     ],
		[ "window_set_min_height",    window_set_min_height    ],
		[ "window_set_max_height",    window_set_max_height    ],
		[ "window_has_focus",         window_has_focus         ],
		[ "window_device",            window_device            ],
		[ "window_view_mouse_get_x",  window_view_mouse_get_x  ],
		[ "window_view_mouse_get_y",  window_view_mouse_get_y  ],
		[ "window_views_mouse_get_x", window_views_mouse_get_x ],
		[ "window_views_mouse_get_y", window_views_mouse_get_y ],

		//display
		[ "display_reset",             display_reset             ],
		[ "display_get_width",         display_get_width         ],
		[ "display_get_height",        display_get_height        ],
		[ "display_get_orientation",   display_get_orientation   ],
		[ "display_get_dpi_x",         display_get_dpi_x         ],
		[ "display_get_dpi_y",         display_get_dpi_y         ],
		[ "display_get_gui_width",     display_get_gui_width     ],
		[ "display_get_gui_height",    display_get_gui_height    ],
		[ "display_get_timing_method", display_get_timing_method ],
		[ "display_get_sleep_margin",  display_get_sleep_margin  ],
		[ "display_get_frequency",     display_get_frequency     ],
		[ "display_mouse_get_x",       display_mouse_get_x       ],
		[ "display_mouse_get_y",       display_mouse_get_y       ],
		[ "display_mouse_set",         display_mouse_set         ],
		[ "display_set_gui_size",      display_set_gui_size      ],
		[ "display_set_gui_maximise",  display_set_gui_maximise  ],
		[ "display_set_ui_visibility", display_set_ui_visibility ],
		[ "display_set_timing_method", display_set_timing_method ],
		[ "display_set_sleep_margin",  display_set_sleep_margin  ],

		//keyboard
		[ "io_clear",                io_clear                ],
		[ "keyboard_check",          keyboard_check          ],
		[ "keyboard_check_pressed",  keyboard_check_pressed  ],
		[ "keyboard_check_released", keyboard_check_released ],
		[ "keyboard_check_direct",   keyboard_check_direct   ],
		[ "keyboard_clear",          keyboard_clear          ],
		[ "keyboard_set_map",        keyboard_set_map        ],
		[ "keyboard_get_map",        keyboard_get_map        ],
		[ "keyboard_unset_map",      keyboard_unset_map      ],
		[ "keyboard_set_numlock",    keyboard_set_numlock    ],
		[ "keyboard_get_numlock",    keyboard_get_numlock    ],

		[ "keyboard_key",            function() /*=>*/ {return keyboard_key}      ],
		[ "keyboard_lastkey",        function() /*=>*/ {return keyboard_lastkey}  ],
		[ "keyboard_lastchar",       function() /*=>*/ {return keyboard_lastchar} ],
		[ "keyboard_string",         function() /*=>*/ {return keyboard_string}   ],

		[ "mouse_button",                  function() /*=>*/ {return mouse_button}            ],
		[ "mouse_x",                       function() /*=>*/ {return mouse_x}                 ],
		[ "mouse_y",                       function() /*=>*/ {return mouse_y}                 ],
		[ "mouse_check_button",            mouse_check_button            ],
		[ "mouse_check_button_pressed",    mouse_check_button_pressed    ],
		[ "mouse_check_button_released",   mouse_check_button_released   ],
		[ "mouse_clear",                   mouse_clear                   ],

		[ "window_mouse_get_x",            window_mouse_get_x            ],
		[ "window_mouse_get_y",            window_mouse_get_y            ],
		[ "window_mouse_set",              window_mouse_set              ],

		[ "gamepad_is_supported",          gamepad_is_supported          ],
		[ "gamepad_is_connected",          gamepad_is_connected          ],
		[ "gamepad_get_guid",              gamepad_get_guid              ],
		[ "gamepad_get_device_count",      gamepad_get_device_count      ],
		[ "gamepad_get_description",       gamepad_get_description       ],
		[ "gamepad_get_button_threshold",  gamepad_get_button_threshold  ],
		[ "gamepad_get_axis_deadzone",     gamepad_get_axis_deadzone     ],
		[ "gamepad_get_option",            gamepad_get_option            ],
		[ "gamepad_set_button_threshold",  gamepad_set_button_threshold  ],
		[ "gamepad_set_axis_deadzone",     gamepad_set_axis_deadzone     ],
		[ "gamepad_set_vibration",         gamepad_set_vibration         ],
		[ "gamepad_set_colour",            gamepad_set_colour            ],
		[ "gamepad_set_option",            gamepad_set_option            ],
		[ "gamepad_axis_count",            gamepad_axis_count            ],
		[ "gamepad_axis_value",            gamepad_axis_value            ],
		[ "gamepad_button_check",          gamepad_button_check          ],
		[ "gamepad_button_check_pressed",  gamepad_button_check_pressed  ],
		[ "gamepad_button_check_released", gamepad_button_check_released ],
		[ "gamepad_button_count",          gamepad_button_count          ],
		[ "gamepad_button_value",          gamepad_button_value          ],
		[ "gamepad_hat_count",             gamepad_hat_count             ],
		[ "gamepad_hat_value",             gamepad_hat_value             ],

		//string
		[ "string",                 string                 ],
		[ "string_ext",             string_ext             ],
		[ "ansi_char",              ansi_char              ],
		[ "chr",                    chr                    ],
		[ "ord",                    ord                    ],
		[ "real",                   real                   ],
		[ "string_byte_at",         string_byte_at         ],
		[ "string_byte_length",     string_byte_length     ],
		[ "string_set_byte_at",     string_set_byte_at     ],
		[ "string_char_at",         string_char_at         ],
		[ "string_ord_at",          string_ord_at          ],
		[ "string_length",          string_length          ],
		[ "string_pos",             string_pos             ],
		[ "string_pos_ext",         string_pos_ext         ],
		[ "string_last_pos",        string_last_pos        ],
		[ "string_last_pos_ext",    string_last_pos_ext    ],
		[ "string_starts_with",     string_starts_with     ],
		[ "string_ends_with",       string_ends_with       ],
		[ "string_count",           string_count           ],
		[ "string_copy",            string_copy            ],
		[ "string_delete",          string_delete          ],
		[ "string_digits",          string_digits          ],
		[ "string_format",          string_format          ],
		[ "string_insert",          string_insert          ],
		[ "string_letters",         string_letters         ],
		[ "string_lettersdigits",   string_lettersdigits   ],
		[ "string_lower",           string_lower           ],
		[ "string_repeat",          string_repeat          ],
		[ "string_replace",         string_replace         ],
		[ "string_replace_all",     string_replace_all     ],
		[ "string_upper",           string_upper           ],
		[ "string_hash_to_newline", string_hash_to_newline ],
		[ "string_trim",            string_trim            ],
		[ "string_trim_start",      string_trim_start      ],
		[ "string_trim_end",        string_trim_end        ],
		[ "string_split",           string_split           ],
		[ "string_split_ext",       string_split_ext       ],
		[ "string_join",            string_join            ],
		[ "string_join_ext",        string_join_ext        ],
		[ "string_concat",          string_concat          ],
		[ "string_concat_ext",      string_concat_ext      ],
		[ "string_width",           string_width           ],
		[ "string_width_ext",       string_width_ext       ],
		[ "string_height",          string_height          ],
		[ "string_height_ext",      string_height_ext      ],
		[ "string_foreach",         string_foreach         ],

		//date time
		[ "date_set_timezone",       date_set_timezone       ],
		[ "date_get_timezone",       date_get_timezone       ],

		[ "current_time",            function() /*=>*/ {return current_time}      ],
		[ "current_second",          function() /*=>*/ {return current_second}    ],
		[ "current_minute",          function() /*=>*/ {return current_minute}    ],
		[ "current_hour",            function() /*=>*/ {return current_hour}      ],
		[ "current_day",             function() /*=>*/ {return current_day}       ],
		[ "current_weekday",         function() /*=>*/ {return current_weekday}   ],
		[ "current_month",           function() /*=>*/ {return current_month}     ],
		[ "current_year",            function() /*=>*/ {return current_year}      ],

		[ "date_create_datetime",    date_create_datetime    ],
		[ "date_current_datetime",   date_current_datetime   ],
		[ "date_compare_date",       date_compare_date       ],
		[ "date_compare_datetime",   date_compare_datetime   ],
		[ "date_compare_time",       date_compare_time       ],
		[ "date_valid_datetime",     date_valid_datetime     ],
		[ "date_date_of",            date_date_of            ],
		[ "date_time_of",            date_time_of            ],
		[ "date_is_today",           date_is_today           ],
		[ "date_leap_year",          date_leap_year          ],
		[ "date_date_string",        date_date_string        ],
		[ "date_datetime_string",    date_datetime_string    ],
		[ "date_time_string",        date_time_string        ],
		[ "date_second_span",        date_second_span        ],
		[ "date_minute_span",        date_minute_span        ],
		[ "date_hour_span",          date_hour_span          ],
		[ "date_day_span",           date_day_span           ],
		[ "date_week_span",          date_week_span          ],
		[ "date_month_span",         date_month_span         ],
		[ "date_year_span",          date_year_span          ],
		[ "date_days_in_month",      date_days_in_month      ],
		[ "date_days_in_year",       date_days_in_year       ],
		[ "date_get_second",         date_get_second         ],
		[ "date_get_minute",         date_get_minute         ],
		[ "date_get_hour",           date_get_hour           ],
		[ "date_get_day",            date_get_day            ],
		[ "date_get_weekday",        date_get_weekday        ],
		[ "date_get_week",           date_get_week           ],
		[ "date_get_month",          date_get_month          ],
		[ "date_get_year",           date_get_year           ],
		[ "date_get_second_of_year", date_get_second_of_year ],
		[ "date_get_minute_of_year", date_get_minute_of_year ],
		[ "date_get_hour_of_year",   date_get_hour_of_year   ],
		[ "date_get_day_of_year",    date_get_day_of_year    ],
		[ "date_inc_second",         date_inc_second         ],
		[ "date_inc_minute",         date_inc_minute         ],
		[ "date_inc_hour",           date_inc_hour           ],
		[ "date_inc_day",            date_inc_day            ],
		[ "date_inc_week",           date_inc_week           ],
		[ "date_inc_month",          date_inc_month          ],
		[ "date_inc_year",           date_inc_year           ],

		[ "get_timer",  get_timer        ],
		[ "delta_time", function() /*=>*/ {return delta_time} ],

		//number
		[ "choose",          choose          ], 
		[ "random",          random          ], 
		[ "random_range",    random_range    ], 
		[ "irandom",         irandom         ], 
		[ "irandom_range",   irandom_range   ], 
		[ "random_set_seed", random_set_seed ], 
		[ "random_get_seed", random_get_seed ], 
		[ "randomise",       randomise       ], 

		[ "ui",       ui_raw   ], 
		[ "round",    round    ], 
		[ "floor",    floor    ], 
		[ "frac",     frac     ], 
		[ "abs",      abs      ], 
		[ "sign",     sign     ], 
		[ "ceil",     ceil     ], 
		[ "max",      max      ], 
		[ "mean",     mean     ], 
		[ "median",   median   ], 
		[ "min",      min      ], 
		[ "lerp",     lerp     ], 
		[ "clamp",    clamp    ], 

		[ "exp",      exp      ], 
		[ "ln",       ln       ], 
		[ "power",    power    ], 
		[ "sqr",      sqr      ], 
		[ "sqrt",     sqrt     ], 
		[ "log2",     log2     ], 
		[ "log10",    log10    ], 
		[ "logn",     logn     ], 

		[ "arccos",   arccos   ],
		[ "arcsin",   arcsin   ],
		[ "arctan",   arctan   ],
		[ "arctan2",  arctan2  ],
		[ "cos",      cos      ],
		[ "sin",      sin      ],
		[ "tan",      tan      ],
		[ "dcos",     dcos     ],
		[ "dsin",     dsin     ],
		[ "dtan",     dtan     ],
		[ "darccos",  darccos  ],
		[ "darcsin",  darcsin  ],
		[ "darctan",  darctan  ],
		[ "darctan2", darctan2 ],
		[ "degtorad", degtorad ],
		[ "radtodeg", radtodeg ],

		[ "point_direction",           point_direction           ],
		[ "point_distance",            point_distance            ],
		[ "point_distance_3d",         point_distance_3d         ],
		[ "distance_to_object",        distance_to_object        ],
		[ "distance_to_point",         distance_to_point         ],
		[ "dot_product",               dot_product               ],
		[ "dot_product_3d",            dot_product_3d            ],
		[ "dot_product_normalised",    dot_product_normalised    ],
		[ "dot_product_3d_normalised", dot_product_3d_normalised ],
		[ "angle_difference",          angle_difference          ],
		[ "lengthdir_x",               lengthdir_x               ],
		[ "lengthdir_y",               lengthdir_y               ],

		[ "matrix_get",                              matrix_get                              ],
		[ "matrix_set",                              matrix_set                              ],
		[ "matrix_build",                            matrix_build                            ],
		[ "matrix_multiply",                         matrix_multiply                         ],
		[ "matrix_build_identity",                   matrix_build_identity                   ],
		[ "matrix_build_lookat",                     matrix_build_lookat                     ],
		[ "matrix_build_projection_ortho",           matrix_build_projection_ortho           ],
		[ "matrix_build_projection_perspective",     matrix_build_projection_perspective     ],
		[ "matrix_build_projection_perspective_fov", matrix_build_projection_perspective_fov ],
		[ "matrix_transform_vertex",                 matrix_transform_vertex                 ],

		[ "matrix_stack_is_empty",                   matrix_stack_is_empty                   ],
		[ "matrix_stack_clear",                      matrix_stack_clear                      ],
		[ "matrix_stack_set",                        matrix_stack_set                        ],
		[ "matrix_stack_push",                       matrix_stack_push                       ],
		[ "matrix_stack_pop",                        matrix_stack_pop                        ],
		[ "matrix_stack_top",                        matrix_stack_top                        ],
		
		[ "point_in_rectangle",                      point_in_rectangle                      ],
		[ "point_in_triangle",                       point_in_triangle                       ],
		[ "point_in_circle",                         point_in_circle                         ],
		[ "rectangle_in_rectangle",                  rectangle_in_rectangle                  ],
		[ "rectangle_in_triangle",                   rectangle_in_triangle                   ],
		[ "rectangle_in_circle",                     rectangle_in_circle                     ],

		//file
		[ "file_exists_empty",     file_exists_empty     ],
		//[ "file_delete",         file_delete           ],
		//[ "file_rename",         file_rename           ],
		//[ "file_copy",           file_copy             ],
		[ "file_find_first",       file_find_first       ],
		[ "file_find_next",        file_find_next        ],
		[ "file_find_close",       file_find_close       ],
		[ "file_attributes",       file_attributes       ],

		[ "filename_name",         filename_name         ],
		[ "filename_path",         filename_path         ],
		[ "filename_dir",          filename_dir          ],
		[ "filename_drive",        filename_drive        ],
		[ "filename_ext",          filename_ext          ],
		[ "filename_change_ext",   filename_change_ext   ],

		[ "get_open_filename",     get_open_filename     ],
		[ "get_open_filename_ext", get_open_filename_ext ],
		[ "get_save_filename",     get_save_filename     ],
		[ "get_save_filename_ext", get_save_filename_ext ],

		//[ "ini_open", ini_open ],
		//[ "ini_close", ini_close ],
		//[ "ini_write_real", ini_write_real ],
		//[ "ini_write_string", ini_write_string ],
		//[ "ini_read_real", ini_read_real ],
		//[ "ini_read_string", ini_read_string ],
		//[ "ini_key_exists", ini_key_exists ],
		//[ "ini_section_exists", ini_section_exists ],
		//[ "ini_key_delete", ini_key_delete ],
		//[ "ini_section_delete", ini_section_delete ],
		//[ "ini_open_from_string", ini_open_from_string ],

		//[ "file_text_open_read", file_text_open_read ],
		//[ "file_text_open_write", file_text_open_write ],
		//[ "file_text_open_append", file_text_open_append ],
		//[ "file_text_open_from_string", file_text_open_from_string ],
		//[ "file_text_read_real", file_text_read_real ],
		//[ "file_text_read_string", file_text_read_string ],
		//[ "file_text_readln", file_text_readln ],
		//[ "file_text_write_real", file_text_write_real ],
		//[ "file_text_write_string", file_text_write_string ],
		//[ "file_text_writeln", file_text_writeln ],
		//[ "file_text_eoln", file_text_eoln ],
		//[ "file_text_eof", file_text_eof ],
		//[ "file_text_close", file_text_close ],

		//[ "file_bin_open", file_bin_open ],
		//[ "file_bin_rewrite", file_bin_rewrite ],
		//[ "file_bin_close", file_bin_close ],
		//[ "file_bin_size", file_bin_size ],
		//[ "file_bin_position", file_bin_position ],
		//[ "file_bin_seek", file_bin_seek ],
		//[ "file_bin_write_byte", file_bin_write_byte ],
		//[ "file_bin_read_byte", file_bin_read_byte ],

		//[ "directory_exists", directory_exists ],
		//[ "directory_create", directory_create ],
		//[ "directory_destroy", directory_destroy ],
		[ "temp_directory",    function() /*=>*/ {return temp_directory}    ],
		[ "working_directory", function() /*=>*/ {return working_directory} ],
		[ "program_directory", function() /*=>*/ {return program_directory} ],

		[ "json_encode",       json_encode             ],
		[ "json_decode",       json_decode             ],
		[ "json_stringify",    json_stringify          ],
		[ "json_parse",        json_parse              ],

		//buffer
		[ "buffer_exists",                        buffer_exists                        ],
		[ "buffer_create",                        buffer_create                        ],
		[ "buffer_create_from_vertex_buffer",     buffer_create_from_vertex_buffer     ],
		[ "buffer_create_from_vertex_buffer_ext", buffer_create_from_vertex_buffer_ext ],
		[ "buffer_delete",                        buffer_delete                        ],
		[ "buffer_read",                          buffer_read                          ],
		[ "buffer_write",                         buffer_write                         ],
		[ "buffer_fill",                          buffer_fill                          ],
		[ "buffer_seek",                          buffer_seek                          ],
		[ "buffer_tell",                          buffer_tell                          ],
		[ "buffer_peek",                          buffer_peek                          ],
		[ "buffer_poke",                          buffer_poke                          ],
		[ "buffer_save",                          buffer_save                          ],
		[ "buffer_save_ext",                      buffer_save_ext                      ],
		[ "buffer_save_async",                    buffer_save_async                    ],
		[ "buffer_load",                          buffer_load                          ],
		[ "buffer_load_ext",                      buffer_load_ext                      ],
		[ "buffer_load_async",                    buffer_load_async                    ],
		[ "buffer_load_partial",                  buffer_load_partial                  ],
		[ "buffer_compress",                      buffer_compress                      ],
		[ "buffer_decompress",                    buffer_decompress                    ],
		[ "buffer_async_group_begin",             buffer_async_group_begin             ],
		[ "buffer_async_group_option",            buffer_async_group_option            ],
		[ "buffer_async_group_end",               buffer_async_group_end               ],
		[ "buffer_copy",                          buffer_copy                          ],
		[ "buffer_copy_from_vertex_buffer",       buffer_copy_from_vertex_buffer       ],
		[ "buffer_get_type",                      buffer_get_type                      ],
		[ "buffer_get_alignment",                 buffer_get_alignment                 ],
		[ "buffer_get_address",                   buffer_get_address                   ],
		[ "buffer_get_size",                      buffer_get_size                      ],
		[ "buffer_get_surface",                   buffer_get_surface                   ],
		[ "buffer_set_surface",                   buffer_set_surface                   ],
		[ "buffer_resize",                        buffer_resize                        ],
		[ "buffer_sizeof",                        buffer_sizeof                        ],
		[ "buffer_md5",                           buffer_md5                           ],
		[ "buffer_sha1",                          buffer_sha1                          ],
		[ "buffer_crc32",                         buffer_crc32                         ],
		[ "buffer_base64_encode",                 buffer_base64_encode                 ],
		[ "buffer_base64_decode",                 buffer_base64_decode                 ],
		[ "buffer_base64_decode_ext",             buffer_base64_decode_ext             ],
		[ "buffer_set_used_size",                 buffer_set_used_size                 ],

		//os
		[ "os_browser",              function() /*=>*/ {return os_browser}        ],
		[ "os_device",               function() /*=>*/ {return os_device}         ],
		[ "os_type",                 function() /*=>*/ {return os_type}           ],
		[ "os_version",              function() /*=>*/ {return os_version}        ],
		[ "os_is_paused",            os_is_paused            ],
		[ "os_is_network_connected", os_is_network_connected ],
		[ "os_get_config",           os_get_config           ],
		[ "os_get_language",         os_get_language         ],
		[ "os_get_region",           os_get_region           ],
		[ "os_get_info",             os_get_info             ],
		[ "os_powersave_enable",     os_powersave_enable     ],
		[ "os_lock_orientation",     os_lock_orientation     ],
		[ "os_check_permission",     os_check_permission     ],
		[ "os_request_permission",   os_request_permission   ],

		//debug
		[ "print",        print        ],
		[ "noti_error",   noti_error   ],
		[ "noti_warning", noti_warning ],
		
		//animation
		[ "animation_playing",   function( ) /*=>*/ { return PROJECT.animator.is_playing? lua_true : lua_false; }],
		[ "animation_play",      function( ) /*=>*/ { PROJECT.animator.resume();    }],
		[ "animation_pause",     function( ) /*=>*/ { PROJECT.animator.pause();     }],
		[ "animation_stop",      function( ) /*=>*/ { PROJECT.animator.stop();      }],
		[ "animation_set_frame", function(f) /*=>*/ { PROJECT.animator.setFrame(f); }],
		[ "animation_render",    function( ) /*=>*/ { PROJECT.animator.render();    }],
		
		//panel
		[ "set_tooltip", function(txt) /*=>*/ { TOOLTIP = txt; }],
		
		[ "panel_get", function(type) {
			switch(type) {
				case "animation" :	return PANEL_ANIMATION; 
				case "collection" : return PANEL_COLLECTION; 
				case "graph" :		return PANEL_GRAPH; 
				case "inspector" :	return PANEL_INSPECTOR; 
				case "main" :		return PANEL_MAIN; 
			}
			
			return undefined;
		} ],
		
		[ "draw_text_set_format",	function(ind) { 
			switch(ind) {
				case 0 : draw_set_font(f_h3);  draw_set_color(COLORS._main_text); break;
				case 1 : draw_set_font(f_p0);  draw_set_color(COLORS._main_text); break;
				case 2 : draw_set_font(f_p1);  draw_set_color(COLORS._main_text_sub); break;
				case 3 : draw_set_font(f_p2);  draw_set_color(COLORS._main_text_sub); break;
				case 4 : draw_set_font(f_p3);  draw_set_color(COLORS._main_text_sub); break;
			}
			
			return undefined;
		}], 
		
		//nodes
		[ "node_get",	function(nodeId) { 
			if(!ds_map_exists(PROJECT.nodeNameMap, nodeId)) return undefined;
			return PROJECT.nodeNameMap[? nodeId];
		}], 
		
		[ "node_get_input_value", function(nodeId, input) { 
			if(!ds_map_exists(PROJECT.nodeNameMap, nodeId)) return undefined;
			var node = PROJECT.nodeNameMap[? nodeId];
			
			if(!struct_has(node.inputMap, input)) return undefined;
			return node.inputMap[$ input].getValue();
		}], 
		
		[ "node_set_input_value", function(nodeId, input, value) { 
			if(!ds_map_exists(PROJECT.nodeNameMap, nodeId)) return undefined;
			var node = PROJECT.nodeNameMap[? nodeId];
			
			if(!struct_has(node.inputMap, input)) return undefined;
			return node.inputMap[$ input].setValue(value);
		}], 
		
		[ "node_get_output_value", function(nodeId, input) { 
			if(!ds_map_exists(PROJECT.nodeNameMap, nodeId)) return undefined;
			var node = PROJECT.nodeNameMap[? nodeId];
			
			if(!struct_has(node.outputMap, input)) return undefined;
			return node.outputMap[$ input].getValue();
		}],
		
		[ "element_get", function() {
			if(HOVERING_ELEMENT == noone) 
				return undefined;
			
			var ele = HOVERING_ELEMENT;
			for( var i = 0; i < argument_count; i++ ) {
				if(!is_struct(ele) || !struct_has(ele, argument[i])) 
					return undefined;
				ele = ele[$ argument[i]];
			}
			return ele;
		}],
		
		[ "__panel_create", function(ID, panel = "") { 
			var _addon = noone;
			with(_addon_custom) if(self.ID == ID) _addon = self;
			if(_addon == noone) return undefined;
			
			var arr = variable_struct_get_names(_addon.panels);
			
			for( var i = 0, n = array_length(arr); i < n; i++ ) {
				if(arr[i] != panel) continue;
				
				var pane  = _addon.panels[$ arr[i]];
				dialogPanelCall(new addonPanel(_addon, pane));
			}
			
			return undefined;
		}],
		
		@"
		function panel_create(panel)
			__panel_create(ID, panel)
		end
		",
	];
#endregion